#include "udp_server.hpp"
#include <memory>
#include <string>
using namespace ns_server;

static void usage(string proc){
    cout << "Usage:\n\t" << proc << "port\n"
         << endl;
}



//上层的业务处理，不关心网络发送，只负责信息处理
//转大写
string transactionString(string request){
    string result;
    char c;
    for (auto &r : request)
    {
        if(islower(r)){
            c = toupper(r);
        }else{
            c = r;
        }
        result.push_back(c);
    }
    return result;
}

static bool safeCheck(const string command){
    bool pass = 1;
    auto pos = command.find("mv");
    if(pos != string::npos){
        pass = false; 
    }
    pos = command.find("rm");
    if(pos != string::npos){
        pass = false; 
    }
    pos = command.find("kill");
    if(pos != string::npos){
        pass = false; 
    }
    return pass;
}

//客户端发送命令让服务器运行，并返回结果显示在客户端
string excuteCommand(string command){

    //1、安全检查
    if(!safeCheck(command)){
        return "fxxk u!";
    }

    //2、获取命令，执行业务
    FILE *fp = popen(command.c_str(), "r");
    if(fp==nullptr){
        return "NULL";
    }
    //3、获取结果
    char line[1024];
    string result;
    while (fgets(line, sizeof(line), fp) != NULL){
        result += line;
    }
    pclose(fp);

    return result;

}

//云服务器不能绑定ip地址，需要在运行的时候添加端口号
// ./udp_server port
int main(int argc, char* argv[]){
    cout << " ↓ server ↓ " << endl;

    //检查argv的字符串数量是否为2
    if(argc != 2){
        usage(argv[0]);
        exit(USAGE_ERR);
        cerr << "argc != 2" << endl; 
    }

    uint16_t port = atoi(argv[1]);
    
    //云服务器不能绑定ip地址，需要在运行的时候添加端口号
    //unique_ptr<UdpServer> usvr(new UdpServer("1.1.1.1", 8080));
    unique_ptr<UdpServer> usvr(new UdpServer(port));

    //服务器初始化+启动
    usvr->Start();

    return 0;
}